package com.example.zhanghao.utils;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import com.example.zhanghao.DTO.PayDto;
import org.apache.commons.codec.Charsets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import static com.example.zhanghao.config.HuPiJiaoConstant.*;


@Component
public class HupijiaoHandler {

    private static final Logger LOG = LoggerFactory.getLogger(HupijiaoHandler.class);

    /**
     * 获取精确到秒的时间戳   原理 获取毫秒时间戳，因为 1秒 = 100毫秒 去除后三位 就是秒的时间戳
     * @return
     */
    public static int getSecondTimestamp(Date date){
        if (null == date) {
            return 0;
        }
        String timestamp = String.valueOf(date.getTime());
        int length = timestamp.length();
        if (length > 3) {
            return Integer.valueOf(timestamp.substring(0,length-3));
        } else {
            return 0;
        }
    }


    public static String getHashAndTime(PayDto payDto){
        // 请求路径
        String url = "https://api.xunhupay.com/payment/do.html";

        Map<String,Object> options = new HashMap<>();
        // 设置版本号
        options.put("version","1.1");
        // 设置 appid
        options.put("appid",appid);

        // 密钥不需要参数
        //options.put("appsecret",appsecret);

        // 订单号 具体内容自己控制 长度 32位
        options.put("trade_order_id",payDto.getTradeOrderId());

        // 价格价格 精确到分
        options.put("total_fee",payDto.getTotalFee());

        // 标题
        options.put("title",payDto.getTitle());

        // 当前时间戳 调用 刚写的方法 getSecondTimestamp
        options.put("time", getSecondTimestamp(new Date()));

        // notify_url 回调地址
        options.put("notify_url",notify_url);

        // nonce_str  随机值 32位内  作用: 1.避免服务器页面缓存，2.防止安全密钥被猜测出来(md5 密钥越复杂，就越难解密出来)
        options.put("nonce_str","740969606");

        if(payDto.getPayType() != null && payDto.getPayType().equals("phone")){
            options.put("return_url",return_url);
            options.put("callback_url",callback_url);
            options.put("type","WAP");
        }

        // 为了获取 MD5 加密前的字符串
        StringBuilder strB = new StringBuilder();

        // 将HashMap 进行 键 的 Ascll 从小到大排序 并 将每个 hashmap元素 以 & 拼接起来
        options.entrySet().stream().sorted((e1,e2) -> e1.getKey().compareTo(e2.getKey())).forEach(a ->{
            strB.append(a).append("&");});

        // 去除 最后一位的 &
        strB.deleteCharAt(strB.length()-1);

        // 拼接上密钥
        strB.append(appsecret);

        // 调用 Hutool 的 加密工具 进行 MD5 加密
        String s = SecureUtil.md5(strB.toString());

        // 必填 hash 签名
        options.put("hash", s);

        String postRes = HttpUtil.post(url, options);

        return postRes;

    }

}